from django.shortcuts import render
from rest_framework.views import APIView
from django.conf import settings
from urllib.parse import urlencode
from rest_framework.response import Response
from urllib.request import urlopen
from urllib.parse import parse_qs
from .utils import QQOauth
from .models import OAuthQQUser
from .serializers import QQOauthCreateSerialzier
from rest_framework_jwt.settings import api_settings


# Create your views here.

class QQOauthURLView(APIView):

    """
    生成一个url

    GET /oauth/qq/statues/

    """
    # 生成auth_url
    # https://graph.qq.com/oauth2.0/authorize
    # 请求参数请包含如下内容：
    # response_type   必须      授权类型，此值固定为“code”。
    # client_id       必须      申请QQ登录成功后，分配给应用的appid。
    # redirect_uri    必须      成功授权后的回调地址，必须是注册appid时填写的主域名下的地址，建议设置为网站首页或网站的用户中心。注意需要将url进行URLEncode。
    # state           必须      client端的状态值。用于第三方应用防止CSRF攻击，成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。
    # scope              可选      scope=get_user_info

    def get(self,request):

        # 有base_url
        qq = QQOauth()

        auth_url = qq.get_url()


        return Response({'auth_url':auth_url})


class QQOauthCreateView(APIView):
    """
    根据 返回的code  生成token

    """
    #/oauth/qq/users/
    def get(self,request):

        #获取code
        code = request.query_params.get('code')

        if code is None:
            return Response(status=400)

        qq = QQOauth()
        # 通过code 换token
        token = qq.get_token(code)

        openid = qq.get_openid(token)


        # 我们需要根据 openid 来进行判断
        # 如果 openid 已经在数据库中,说明已经绑定过,直接返回登录的token
        # 如果 没有在数据库中,说明是第一次绑定,则它跳转到 绑定页面

        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 说明是第一次绑定,则它跳转到 绑定页面

            #需要把 openid 应该作为一个参数 传递过去
            # return Response({'openid':openid})
            # 因为openid非常重要,所以需要对openid进行处理

            access_token = OAuthQQUser.genericte_open_id_token(openid)
            #'eyJhbGciOiJIUzI1NiIsImV4cCI6MTUzMDk2MjQ3MywiaWF0IjoxNTMwOTU4ODczfQ.eyJvcGVuaWQiOiI3QTlBNjAwOTVFQ0U0OENCODVFNzhBNzBGMTgwMjVGOCJ9.P_qKchwprWNox-Eh_bE2AYP5onbrlZkK2wbac8WOcrY'
            return Response({'access_token':access_token})

        else:
            user = qquser.user
            #如果 openid 已经在数据库中,说明已经绑定过,直接返回登录的token
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)

            response = Response({
                'token':token,
                'user_id':user.id,
                'username':user.username
            })

            return response


    def post(self,request):
        """
        绑定用户的时候
        1. 将手机号,密码 短信验证码 以及 access_token(openid) 提交给后台
        2. 对手机号,access_token进行校验
        3. 将用户信息和openid进行绑定处理,数据入库

        """

        # 创建序列化器
        serializer = QQOauthCreateSerialzier(data=request.data)
        # 进行校验
        serializer.is_valid(raise_exception=True)
        # 保存
        user = serializer.save()
        # 返回登录的token
        # 生成已登录的token
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        payload = jwt_payload_handler(user)
        token = jwt_encode_handler(payload)

        response = Response({
            'token':token,
            'user_id':user.id,
            'username':user.username
        })

        return response






# from itsdangerous import TimedJSONWebSignatureSerializer as S
# # secret_key 加密的字符串
# # second 加密的时效
# #序列化器的初始化
# s = S('abc',1)
#
# # 我们可以将 一些敏感的数据 传递给序列化器,序列化器经过一定的算法之后,会生成一个 字符串
# dict = {
#     'openid':'123456'
# }
# data = s.dumps(dict)
# data
#
# # 数据验证
# s.loads('eyJhbGciOiJIUzI1NiIsImV4cCI6MTUzMDk2MTc5MywiaWF0IjoxNTMwOTU4MTkzfQ.eyJvcGVuaWQiOiIxMjM0NTYifQ.fPHVNVPrdd5pf_gpGtpWf8RDL8k3yw0sURYYKWoGt1A')
#
#
# s = S('abc',1)
#
# # 我们可以将 一些敏感的数据 传递给序列化器,序列化器经过一定的算法之后,会生成一个 字符串
# dict = {
#     'openid':'123456'
# }
# data = s.dumps(dict)
# data


